home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) 1989 Bellcore
- * All Rights Reserved
- * Permission is granted to copy or use this program, EXCEPT that it
- * may not be sold for profit, the copyright notice must be reproduced
- * on copies, and credit should be given to Bellcore where it is due.
- * BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
- */
- /* $Header: pixel.c,v 1.1 89/05/10 18:21:32 sau Locked $
- $Source: /usr/u/sau/mgr/src/dec/RCS/pixel.c,v $
- */
- static char RCSid_[] = "$Source: /usr/u/sau/mgr/src/dec/RCS/pixel.c,v $$Revision: 1.1 $";
-
- /*
- * set/clear/ or invert a pixel (Portable version) (SAU)
- * return current bit setting (i.e. may be used to replace bit_on)
- */
-
- #include "bitmap.h"
- #ifdef atarist
- #include <linea.h>
- #endif
-
- bit_point(map,x,y,op)
- register BITMAP *map;
- register int x,y;
- int op;
- {
- register int bit; /* dst bit */
- register DATA *base; /* dst word */
-
- /* clipping */
-
- #ifndef NOCLIP
- if (x<0 || x>BIT_WIDE(map) || y<0 || y>BIT_HIGH(map))
- return(-1);
- #endif
-
- #ifdef INVERT
- /* invert all raster ops */
-
- op = op_invert[15&op];
- #endif
-
- x += map->x0;
- y += map->y0;
- #ifdef atarist
- if (IS_SCREEN(map)) {
- return scrpoint(map, x, y, op);
- }
- #endif
- base = y * BIT_LINE(map) + (x>>LOGBITS) + (map->data);
- bit = GETLSB(MSB,(x & BITS));
-
- switch(OPCODE(op)) {
- case OPCODE(SRC):
- case OPCODE(SRC | DST):
- case OPCODE(SRC | ~DST):
- case OPCODE(~0):
- *base |= bit;
- break;
- case OPCODE(~SRC):
- case OPCODE(~(SRC|DST)):
- case OPCODE(DST & ~SRC):
- case OPCODE(0):
- *base &= ~bit;
- break;
- case OPCODE(SRC ^ DST):
- case OPCODE(~DST):
- case OPCODE(SRC & ~DST):
- case OPCODE(~(SRC&DST)):
- *base ^= bit;
- break;
- }
- return(*base&bit);
- }
-
- #ifdef atarist
- scrpoint(map,x,y,op)
- register BITMAP *map;
- register int x,y;
- int op;
- {
- register int bit; /* dst bit */
- extern short *Intin, *Ptsin;
-
- /* clipping */
-
- Ptsin[0] = x;
- Ptsin[1] = y;
- bit = linea2();
-
- switch(OPCODE(op)) {
- case OPCODE(SRC):
- case OPCODE(SRC | DST):
- case OPCODE(SRC | ~DST):
- case OPCODE(~0):
- Intin[0] = bit = 0xf; /* set */
- break;
- case OPCODE(~SRC):
- case OPCODE(~(SRC|DST)):
- case OPCODE(DST & ~SRC):
- case OPCODE(0):
- Intin[0] = bit = 0; /* clear */
- break;
- case OPCODE(SRC ^ DST):
- case OPCODE(~DST):
- case OPCODE(SRC & ~DST):
- case OPCODE(~(SRC&DST)):
- bit = linea2(); /* get old bit */
- Intin[0] = bit = bit ^ 0xf; /* invert */
- break;
- default:
- bit = linea2();
- return bit;
- }
- linea1(); /* set bit */
- return bit;
- }
- #endif
-